import plugin from '../../../lib/plugins/plugin.js'
import path from 'node:path'
import fs from 'node:fs/promises'
import api from '../core/api.js'
import puppeteer from '../../../lib/puppeteer/puppeteer.js'
import menuManager from '../../systemDB/menu/menu.js'

// 定义插件目录路径常量
const PLUGIN_DIR = path.resolve(path.dirname(import.meta.url.replace('file:///', '')), '..')
const RESOURCES_DIR = path.resolve(PLUGIN_DIR, 'resources')

/**
 * 商店功能插件
 */
export default class Shop extends plugin {
  constructor() {
    super({
      name: '商店功能',
      dsc: '提供道具购买功能',
      event: 'message',
      priority: 500,
      rule: [
        { reg: '^(?:#|/)?商店$', fnc: 'showShop' },
        { reg: '^(?:#|/)?购买(.*)$', fnc: 'buyItem' },
        { reg: '^(?:#|/)?我的道具$', fnc: 'showMyItems' }
      ]
    })

    // 检查api模块是否正常加载
    this.checkApi()

    logger.info('商店插件已加载')
  }

  // 初始化插件
  async init() {
    // 注册到菜单
    await this.registerToMenu()
  }

  // 注册到系统菜单
  async registerToMenu() {
    const pluginInfo = {
      name: '商店功能',
      dsc: '提供道具购买功能',
      cmds: ['#商店', '#购买', '#我的道具'],
      category: '商店'
    }
    await menuManager.registerPluginMenu(pluginInfo)
  }






  /**
   * 检查API模块是否正常加载
   */
  checkApi() {
    const requiredMethods = ['getAllItems', 'getItemInfoByName', 'getUserGold', 'reduceUserGold', 'addUserGold', 'addUserItem', 'getUserItems', 'getUserUID']
    for (const method of requiredMethods) {
      if (typeof api[method] !== 'function') {
        logger.error(`商店插件: api.${method} 不是一个函数`)
      }
    }
  }

  /**
   * 显示商店
   */
  async showShop() {
    try {
      // 检查模板文件是否存在
      const templatePath = path.resolve(RESOURCES_DIR, 'shop.html')
      try {
        await fs.access(templatePath)
      } catch (err) {
        logger.error(`商店指令: 模板文件不存在: ${templatePath}`)
        return this.reply('商店模板文件不存在，请确保插件安装完整')
      }

      // 获取商品列表
      let items = await api.getAllItems().catch(error => {
        logger.error('商店指令: 获取道具列表失败:', error)
        return []
      })

      // 如果没有商品，初始化一些测试道具
      if (!items.length) {
        logger.info('商店指令: 商品列表为空，初始化测试道具')
        const initialized = await this.initTestItems()
        if (initialized) {
          return this.reply('商店初始化完成，请再次发送 #商店 查看商品')
        } else {
          return this.reply('初始化商店商品失败，请联系管理员')
        }
      }

      // 生成商店图片或文本
      const image = await this.generateShopHTML(items).catch(error => {
        logger.error('商店图片生成失败:', error)
        return null
      })

      if (image) {
        return this.reply([image])
      }

      // 生成图片失败，回退到文本模式
      let shopMsg = '商店商品：\n'
      items.forEach(item => {
        shopMsg += `[${item.name}] - ${item.description} - 价格: ${item.price}金币\n`
      })
      return this.reply(shopMsg)
    } catch (error) {
      logger.error('商店指令: 执行showShop方法时发生未捕获错误:', error)
      return this.reply('商店功能暂时无法使用，请稍后再试')
    }
  }

  /**
   * 初始化测试道具
   * @returns {Promise<boolean>} 是否初始化成功
   */
  async initTestItems() {
    try {
      // 先检查是否已存在测试道具
      const existingItems = await api.getAllItems()
      if (existingItems.some(item => ['potion', 'sword', 'shield'].includes(item.id))) {
        logger.info('商店指令: 测试道具已存在，跳过初始化')
        return true
      }

      await api.addItemInfo({ id: 'potion', name: '体力药水', description: '恢复少量体力', price: 50, type: 'consumable' })
      await api.addItemInfo({ id: 'sword', name: '铁剑', description: '攻击力+5', price: 100, type: 'weapon' })
      await api.addItemInfo({ id: 'shield', name: '木盾', description: '防御力+3', price: 80, type: 'defense' })
      return true
    } catch (error) {
      logger.error('商店指令: 初始化测试道具失败:', error)
      return false
    }
  }

  /**
   * 生成商店HTML图片
   * @param {Array} items 商品列表
   * @returns {Promise<string|false>} 图片路径或false
   */
  async generateShopHTML(items) {
    try {
      const userId = this.e.user_id
      const uid = await api.getUserUID(userId)
      const gold = await api.getUserGold(userId)

      // 准备模板数据
      const data = {
        userId,
        uid,
        gold,
        items
      }

      // 使用绝对路径指向shop.html模板
      const templatePath = path.resolve(RESOURCES_DIR, 'shop.html')

      // 使用puppeteer提供的screenshot方法
      const image = await puppeteer.screenshot('systemDB_shop', { ...data, tplFile: templatePath })
      logger.info(`商店图片生成: 图片生成${image ? '成功' : '失败'}`)
      return image
    } catch (error) {
      logger.error('商店图片生成失败:', error)
      return false
    }
  }

  /**
   * 购买道具
   */
  async buyItem() {
    try {
      const match = this.e.msg.match(/^#购买(.*)$/)
      if (!match || !match[1]) {
        return this.reply('请输入正确的购买格式：#购买[道具名称]')
      }

      const itemName = match[1].trim()
      const userId = this.e.user_id

      // 获取道具信息
      const item = await api.getItemInfoByName(itemName).catch(error => {
        logger.error(`购买指令: 获取道具${itemName}信息失败:`, error)
        return null
      })

      if (!item) {
        return this.reply(`道具 ${itemName} 不存在`)
      }

      // 检查金币是否足够
      const gold = await api.getUserGold(userId).catch(error => {
        logger.error('购买指令: 获取用户金币失败:', error)
        return -1
      })

      if (gold === -1) {
        return this.reply('获取金币信息失败，请稍后再试')
      }

      if (gold < item.price) {
        return this.reply(`金币不足，需要 ${item.price} 金币，您当前有 ${gold} 金币`)
      }

      // 扣除金币并添加道具
      try {
        await api.reduceUserGold(userId, item.price)
        await api.addUserItem(userId, item.id)
      } catch (error) {
        logger.error('购买指令: 购买道具失败:', error)
        // 尝试恢复金币
        await api.addUserGold(userId, item.price).catch(e => {
          logger.error('购买指令: 恢复金币失败:', e)
        })
        return this.reply('购买失败，请稍后再试')
      }

      // 获取剩余金币
      const remainingGold = await api.getUserGold(userId).catch(error => {
        logger.error('购买指令: 获取剩余金币失败:', error)
        return null
      })

      if (remainingGold !== null) {
        return this.reply(`购买 ${item.name} 成功！消耗 ${item.price} 金币，剩余 ${remainingGold} 金币`)
      } else {
        return this.reply(`购买 ${item.name} 成功！消耗 ${item.price} 金币`)
      }
    } catch (error) {
      logger.error('购买指令: 执行buyItem方法时发生未捕获错误:', error)
      return this.reply('购买功能暂时无法使用，请稍后再试')
    }
  }

  /**
   * 显示用户拥有的道具
   */
  async showMyItems() {
    try {
      const userId = this.e.user_id

      // 获取用户道具
      const items = await api.getUserItems(userId).catch(error => {
        logger.error('我的道具指令: 获取用户道具失败:', error)
        return []
      })

      if (!items.length) {
        return this.reply('您当前没有任何道具')
      }

      // 生成道具列表消息
      let itemsMsg = '您的道具列表：\n'
      items.forEach(item => {
        itemsMsg += `[${item.name}] - ${item.description} - 数量: ${item.count}\n`
      })
      return this.reply(itemsMsg)
    } catch (error) {
      logger.error('我的道具指令: 执行showMyItems方法时发生未捕获错误:', error)
      return this.reply('查看道具功能暂时无法使用，请稍后再试')
    }
  }
}